package com.power.ding.controller;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.annotation.Resource;
import javax.xml.xpath.XPathConstants;

import org.springframework.web.bind.annotation.RestController;
import org.w3c.dom.Document;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.power.ding.api.IDeptUserFeign;
import com.power.ding.model.DeptUserParam;
import com.power.ding.model.Di_dept;
import com.power.ding.model.Di_user;
import com.power.ding.model.Di_userdept;
import com.power.ding.service.Di_deptService;
import com.power.ding.service.Di_userService;
import com.power.ding.service.Di_userdeptService;

import cn.hutool.core.util.XmlUtil;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class DeptUserController implements IDeptUserFeign{
	@Resource
	private Di_deptService di_deptService;
	
	@Resource
	private Di_userService di_userService;
	
	@Resource
	private Di_userdeptService di_userdeptService;
	
	@Override
	public JSONObject synAll(String data) {
		JSONObject re=new JSONObject();
		try {
			log.info("synAll xml : {}", data);
			Document document = XmlUtil.readXML(data);
			
			String pubToken=XmlUtil.getByXPath("//list/pubToken", document, XPathConstants.STRING).toString();
			String dataOperateType=XmlUtil.getByXPath("//list/dataOperateType", document, XPathConstants.STRING).toString();
			String dataType=XmlUtil.getByXPath("//list/dataType", document, XPathConstants.STRING).toString();
			String jsondata=XmlUtil.getByXPath("//list/data", document, XPathConstants.STRING).toString();
			
			log.info("dataOperateType : {}", dataOperateType);
			log.info("dataType : {}", dataType);
			log.info("jsondata : {}", jsondata);
			
			if(dataType.equals(DeptUserParam.DATATYPE_DEPT)) {
				// 部门
				if(dataOperateType.equals(DeptUserParam.OPERATETYPE_ADD)) {
					// 新增部门
					Di_dept dept=JSON.parseObject(jsondata, Di_dept.class);
					di_deptService.saveOrUpdate(dept);
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_MODIFY)) {
					// 修改部门
					Di_dept dept=JSON.parseObject(jsondata, Di_dept.class);
					di_deptService.saveOrUpdate(dept);
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_DELETE)) {
					// 删除部门
					Di_dept dept=JSON.parseObject(jsondata, Di_dept.class);
					Di_dept deptLocal=di_deptService.getById(dept.getId());

					if(deptLocal!=null) {
						deptLocal.setRowState(-1);
						di_deptService.saveOrUpdate(deptLocal);
					}
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_MOVE)) {
					// 移动部门
					Di_dept dept=JSON.parseObject(jsondata, Di_dept.class);
					Di_dept deptLocal=di_deptService.getById(dept.getId());

					if(deptLocal!=null) {
						if(dept.getFId()!=null) {
							deptLocal.setFId(dept.getFId());
						}
						if(dept.getFIdText()!=null) {
							deptLocal.setFIdText(dept.getFIdText());
						}
						if(dept.getStep()!=null) {
							deptLocal.setStep(dept.getStep());
						}
						di_deptService.saveOrUpdate(deptLocal);
					}
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_MODSTATUS)) {
					// 修改状态
					Di_dept dept=JSON.parseObject(jsondata, Di_dept.class);
					Di_dept deptLocal=di_deptService.getById(dept.getId());
					
					if(deptLocal!=null) {
						if(dept.getStatus()!=null) {
							deptLocal.setStatus(dept.getStatus());
						}
						if(dept.getStatusText()!=null) {
							deptLocal.setStatusText(dept.getStatusText());
						}
						di_deptService.saveOrUpdate(deptLocal);
					}
				}else {
					log.error("部门系统同步未处理的行为");
				}
			}else if(dataType.equals(DeptUserParam.DATATYPE_USER)) {
				// 人员
				if(dataOperateType.equals(DeptUserParam.OPERATETYPE_ADD)) {
					// 新增人员
					Di_user user=JSON.parseObject(jsondata, Di_user.class);
					di_userService.saveOrUpdate(user);
					
					di_userdeptService.removeByUserId(user.getId());
					JSONObject datajson=JSON.parseObject(jsondata);
					JSONArray orglist=datajson.getJSONArray("orgList");
					if(orglist!=null && orglist.size()>0) {
						List<Di_userdept> udlist=new ArrayList<Di_userdept>();
						for(int i=0; i<orglist.size(); i++) {
							JSONObject item=orglist.getJSONObject(i);
							Di_userdept ud=new Di_userdept();
							ud.setId(user.getId()+"$"+item.getString("id"));
							ud.setRowState(0);
							ud.setLastUpdateTime(Calendar.getInstance().getTime());
							ud.setUserId(user.getId());
							ud.setOrgId(item.getString("id"));
							ud.setUnitId(item.getString("unitId"));
							ud.setIsMain(item.getInteger("isMain"));
							ud.setShowOrder(item.getInteger("showOrder"));
							ud.setOrgName(item.getString("orgName"));
							udlist.add(ud);
						}
						di_userdeptService.saveAll(udlist);
					}
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_MODIFY)) {
					// 修改人员
					Di_user user=JSON.parseObject(jsondata, Di_user.class);
					di_userService.saveOrUpdate(user);
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_MODUSERDEPT) || dataOperateType.equals(DeptUserParam.OPERATETYPE_MOVE)) {
					// 修改人员的部门
					Di_user user=JSON.parseObject(jsondata, Di_user.class);
					di_userdeptService.removeByUserId(user.getId());
					JSONObject datajson=JSON.parseObject(jsondata);
					JSONArray orglist=datajson.getJSONArray("orgList");
					if(orglist!=null && orglist.size()>0) {
						String unitId=null;
						List<Di_userdept> udlist=new ArrayList<Di_userdept>();
						for(int i=0; i<orglist.size(); i++) {
							JSONObject item=orglist.getJSONObject(i);
							Di_userdept ud=new Di_userdept();
							ud.setId(user.getId()+"$"+item.getString("id"));
							ud.setRowState(0);
							ud.setLastUpdateTime(Calendar.getInstance().getTime());
							ud.setUserId(user.getId());
							ud.setOrgId(item.getString("id"));
							ud.setUnitId(item.getString("unitId"));
							ud.setIsMain(item.getInteger("isMain"));
							ud.setShowOrder(item.getInteger("showOrder"));
							ud.setOrgName(item.getString("orgName"));
							udlist.add(ud);
							
							if(ud.getIsMain()!=null && ud.getIsMain()==1) {
								unitId=ud.getUnitId();
							}
						}
						di_userdeptService.saveAll(udlist);
						
						if(unitId!=null) {
							Di_user ur=di_userService.getById(user.getId());
							if(ur!=null) {
								ur.setUnitId(unitId);
								di_userService.saveOrUpdate(ur);
							}
						}
					}
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_DELETE)) {
					// 删除人员
					Di_user user=JSON.parseObject(jsondata, Di_user.class);
					Di_user userLocal=di_userService.getById(user.getId());
					if(userLocal!=null) {
						userLocal.setRowState(-1);
						di_userService.saveOrUpdate(userLocal);
					}
				}else if(dataOperateType.equals(DeptUserParam.OPERATETYPE_MODSTATUS)) {
					// 修改状态
					Di_user user=JSON.parseObject(jsondata, Di_user.class);
					Di_user userLocal=di_userService.getById(user.getId());

					if(userLocal!=null) {
						if(user.getStatus()!=null) {
							userLocal.setStatus(user.getStatus());
						}
						if(user.getStatusText()!=null) {
							userLocal.setStatusText(user.getStatusText());
						}
						di_userService.saveOrUpdate(userLocal);
					}
				}else {
					log.error("人员系统同步未处理的行为");
				}
			}
			
			re.put("code", "200");
			re.put("type", "success");
			re.put("message", "推送成功");
			re.put("token", pubToken);
		}catch(Exception e) {
			e.printStackTrace();
			re.put("code", "10000");
			re.put("type", "error");
			re.put("message", e.getMessage());
		}
		return re;
	}
	
}
